package com.neko.socket;



import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 思路：
 * 1. new ServerSocket(port)
 * 2. ServerSocket.accept() return 连接的 Socket
 * 3. socket.getInputStream();
 * 4. 建立 缓冲区 new byte[1024]
 * 5. 将 inputStream -> byte[1024]
 * 6. 通过 StringBuilder 添加 new String( byte[1024]缓冲区内容 ...)
 * 7. 关闭：inputStream -> socket -> ServerSocket
 * */
public class Server_Socket {

    public static void main(String[] args) throws IOException {

        // 指定 port
        int port = 2001;
        ServerSocket serverSocket = new ServerSocket(port); // 监听本地 Port, 实际上 ServerSocket 的 IP 设定为 127.0.0.1

        // Server 将一直等待 连接的到来
        System.out.println("Server 将一直等待 连接的到来");
        Socket accept = serverSocket.accept();// 自我阻塞，直到 Client 连接过来, 并获取到Client の Socket

        // 连接成功后
        InputStream inputStream = accept.getInputStream();
        // 建立对应缓冲区
        byte[] bytes = new byte[1024];

        int len ; // 通过 bytes[1024] 读取 来自 Client 的InputStream, return 读取长度 length
            // 此时, bytes[1024] 中, 已存了 data

        StringBuilder stringBuilder = new StringBuilder(); // 建立 String筑造器

        // ！！！ 此处 while 是精髓, 实际上是 while = inputStream.read(bytes) ...
        while ((len = inputStream.read(bytes))  != -1) { // 如果读取长度不为 -1
            // 注意：指定编码格式。 Server 和 Client 应当统一, 尽可能使用 UTF-8
            stringBuilder.append(new java.lang.String(bytes, 0, len, "UTF-8"));
        }

        // 输出
        System.out.println("Get message from client: " + stringBuilder);
        inputStream.close();

        // 先关闭 Client 输入插座
        accept.close();
        // 再关闭 Server 输出插座
        serverSocket.close();

    }
}
